package main

import (
	"fmt"

	"go.uber.org/dig"
)

// Database 表示数据库连接
type Database struct{}

// NewDatabase 创建一个新的数据库连接
func NewDatabase() *Database {
	return &Database{}
}

// Service 表示业务服务
type Service struct {
	DB *Database
}

// NewService 创建一个新的业务服务
func NewService(db *Database) *Service {
	return &Service{
		DB: db,
	}
}

// DoSomething 执行服务操作
func (s *Service) DoSomething() {
	fmt.Println("Doing something with the database...")
}

func main() {
	// 创建一个新的 dig 容器
	container := dig.New()

	// 提供组件
	container.Provide(NewDatabase)
	container.Provide(NewService)

	// 执行函数，注入依赖
	err := container.Invoke(func(service *Service) {
		service.DoSomething()
	})
	if err != nil {
		fmt.Printf("Error: %v\n", err)
	}
}
